package cn.bmyi.apiautotest.common;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

/**
 * 实现读取测试数据xml文件参数
 * 
 * @author 毛建杰
 *
 */
public class TestData
{
	private static Document document;

	/**
	 * 加载测试数据xml文件
	 * 
	 * @param inputStream
	 *            测试数据文件InputStream
	 */
	public static void open(InputStream inputStream)
	{
		SAXBuilder builder = new SAXBuilder();
		try
		{
			document = builder.build(inputStream);
		}
		catch (JDOMException | IOException e)
		{
			Logger.error(e.getMessage());
			close();
		}
	}

	/**
	 * 测试数据xml文件使用结束后释放资源
	 */
	public static void close()
	{
		if (document != null)
		{
			document = null;
		}
	}

	/**
	 * 获取测试数据xml文件中指定用例的指定参数
	 * 
	 * @param caseName
	 *            用例名称
	 * @param paramName
	 *            参数名称
	 * @return 参数值
	 */
	public static String getParam(String caseName, String paramName)
	{
		List<Element> paramList = document.getRootElement().getChild(caseName).getChildren();
		for (Element param : paramList)
		{
			if (param.getName().equals(paramName))
			{
				return param.getText();
			}
		}
		return null;
	}

	/**
	 * 获取测试数据xml文件中指定用例的所有参数； 一般在TestNG DataProvider中使用。
	 * 
	 * @param caseName
	 *            用例名称
	 * @return 参数值，格式：[caseName, 参数值1, 参数值2, 参数值3, ..., 参数值N]
	 */
	public static String[] getParams(String caseName)
	{
		List<Element> paramList = document.getRootElement().getChild(caseName).getChildren();
		String[] ret = new String[paramList.size() + 1];
		ret[0] = caseName;
		for (int i = 0; i < ret.length - 1; i++)
		{
			ret[i + 1] = paramList.get(i).getText();
		}
		return ret;
	}

	/**
	 * 获取测试数据xml文件中所有用例的名称
	 * 
	 * @return 用例名称
	 */
	public static String[] getCases()
	{
		List<Element> caseList = document.getRootElement().getChildren();
		String[] ret = new String[caseList.size()];
		for (int i = 0; i < ret.length; i++)
		{
			ret[i] = caseList.get(i).getName();
		}
		return ret;
	}
}
